package com.main.dso;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.generico.dao.ctg.CtgCatalogoDao;
import com.generico.dao.ctg.CtgProductoDao;
import com.generico.dto.ctg.CtgCatalogo;
import com.generico.dto.ctg.CtgProducto;
import com.generico.exception.AsiWebException;
import com.main.cliente.dto.Pedido;
import com.main.cliente.dto.PedidoDetalle;
import com.main.cliente.dto.SgiPersona;
import com.main.dao.PedidoDAO;
import com.main.dao.PedidoDetalleDAO;
import com.main.dao.SgiPersonaDao;
import com.main.dao.UserDAO;
import com.main.java.Role;
import com.main.java.User;
import com.main.java.UserRoles;
import com.web.util.GenericoUtil;

@Service
public class PedidoServiceImpl implements PedidoService{

	
	@Autowired
	private UserDAO userDAO;
	
	@Autowired
	private PedidoDAO pedidoDAO;
	
	@Autowired
	private CtgProductoDao ctgProductoDao;
	
	@Autowired
	private CtgCatalogoDao ctgCatalogoDao;
	
	@Autowired
	private PedidoDetalleDAO pedidoDetalleDAO;
	
	@Autowired
	private SgiPersonaDao personaDAO;
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, AsiWebException.class})
	public void guardarPedido(Long clienteId, String clienteProdlist) throws AsiWebException {

		String dirInstalacion = StringUtils.EMPTY;
		try {
			dirInstalacion = (personaDAO.obtenerPersona(clienteId)).getPersonaDireccion() == null ? "":(personaDAO.obtenerPersona(clienteId)).getPersonaDireccion();
		
		
		Pedido pedido = new Pedido();
		pedido.setPedidoFechaPedido(GenericoUtil.dateFormatAsDD_MM_YYYY___HH_MM_SS_A.format(new Date()));
		pedido.setPedidoEstado("0");//estado nuevo
		pedido.setUser(userDAO.getUserById(clienteId));
		pedido.setPedidoFechaEntrega((GenericoUtil.dateFormatAsDD_MM_YYYY.format(GenericoUtil.sumarRestarDiasFecha(new Date(), 30))));
		pedido.setPedidoDireccionEntrega(dirInstalacion);
		pedidoDAO.guardarPedido(pedido);
		
		
		/**Quitando virgulias y metiendolo en una list**/
		String[] idProductos = clienteProdlist.split("~");
		List<String> list = new ArrayList<String>(idProductos.length);  
		for (String s : idProductos) {  
		    list.add(s);  
		} 
		
		/**colocando en un mapa*/
		Set<String> ctgProductoIdyCantidades = new HashSet<String>(list);	
		Map<Long, BigDecimal> idAProesarMap = new HashMap<Long, BigDecimal>();
		
		for (String key : ctgProductoIdyCantidades) {
//            System.out.println(key + " : " + Collections.frequency(list, key));
//            nuevos registros:
//            	15 : 1
//            	13 : 5
//            	14 : 2
			idAProesarMap.put(Long.parseLong(key), new BigDecimal(Collections.frequency(list, key)));
        }
		
		/**Guardando detalles de pedido*/
		Iterator it = idAProesarMap.keySet().iterator();
		while(it.hasNext()){
		  Long key = (Long) it.next();
		  BigDecimal cantidad = idAProesarMap.get(key);
		  BigDecimal monto;
		  
		  /**System.out.println("ctgProductoId: " + key + " -> cantiadComprada: " + idAProesarMap.get(key));
		  nuevo registro de compra:
			  ctgProductoId: 13 -> cantiadComprada: 8
			  ctgProductoId: 14 -> cantiadComprada: 4
			  ctgProductoId: 15 -> cantiadComprada: 2**/
		  
		  CtgProducto ctgProducto = new CtgProducto();
		  PedidoDetalle pedidoDetalle = new PedidoDetalle();
		  ctgProducto = ctgProductoDao.findByCtgProductoIdId(key);
		  monto = new BigDecimal(ctgProducto.getCtgProductoPrecio());
		  
		  
		  pedidoDetalle.setPedidoDetalleCantidad(idAProesarMap.get(key).toString());
		  pedidoDetalle.setPedido(pedido);
		  pedidoDetalle.setCtgProductoId(ctgProducto);
		  pedidoDetalle.setPedidoDetalleTotal(monto.multiply(cantidad));
		  pedidoDetalleDAO.savePedidoDetalle(pedidoDetalle);
		  
		  /**System.out.println(monto.multiply(cantidad));
		  ctgProductoId: 13 -> cantiadComprada: 7
		  14003.15**/
		}
		
		
		
		
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	}
	
}
